package org.dromara.system.controller.community;

import cn.hutool.json.JSONUtil;
import org.apache.commons.compress.utils.Lists;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.enums.CommunityEnum;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.system.domain.vo.*;
import org.dromara.system.service.ICommonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static cn.dev33.satoken.SaManager.log;

/**
 * 智慧社区大屏相关接口
 *
 * @author xiaochaoge
 * @title: CommuntityCommonController
 * @date 2025/9/11 9:19
 */
@RestController
@RequestMapping({"/communityCommon"})
public class CommunityCommonController {

    @Autowired
    private ICommonService commonService;


    //todo 一、1.获取48个社区所有的经纬度信息及其对应的名字
    @GetMapping({"getCommunityArea"})
    public R<List<CommunityAreaVo>> getCommunityArea() {
        ClassPathResource classPathResource = new ClassPathResource("/static/community.json");
        List<CommunityAreaVo> CommunityDtoList;
        try {
            CommunityDtoList = JSONUtil.toList(JSONUtil.readJSONArray(classPathResource.getFile(), StandardCharsets.UTF_8).toString(), CommunityAreaVo.class);
        } catch (Exception e) {
            log.error("文件资源读取失败......");
            CommunityDtoList = Lists.newArrayList();
        }
        return R.ok(CommunityDtoList);
    }

    //todo 写一个启动初始化缓存的方法，在配置文件中配置是否启动刷新，默认启动刷新缓存。刷新内容包含查询48个从库中的统计数量。
    // 后续调用接口查询直接从redis中取值。可以再增加一个定时任务，每天或者多长时间刷新缓存。  总数直接从缓存中取出48个社区缓存的和即可；
    //todo 二、1.查询用户总数 2.查询小区总数  3.楼栋总数 4.单元总数
    @GetMapping({"getTotal"})
    public R<IndexTotalVo> getTotal() {
        IndexTotalVo vo;
        if (RedisUtils.isExistsObject("communityTotal")) {
            vo = RedisUtils.getCacheObject("communityTotal");
        } else {
            vo = commonService.initCommunity();
        }
        return R.ok(vo);
    }

    //todo 根据社区id过滤信息 (我打算使用每个社区的id作为从库的标识，
    // 这样的话，前端只需要将点击的社区id传过来。服务就能根据该参数值自动去匹配数据源)
    @GetMapping({"getTotalByCommunityId"})
    public R<IndexTotalVo> getTotalByCommunityId(@RequestParam("dataSource") String dataSource) {
        //根据不同参数来传输不同的那个数据源查询。。。。
        int userCount = 0;
        int xqCount = 0;
        int buildingCount = 0;
        int unitCount = 0;
        if (RedisUtils.isExistsObject("userCount" + dataSource)) {
            userCount = RedisUtils.getCacheObject("userCount" + dataSource);
        } else {
            userCount = commonService.getUserCount(dataSource);
        }
        if (RedisUtils.isExistsObject("xqCount" + dataSource)) {
            xqCount = RedisUtils.getCacheObject("xqCount" + dataSource);
        } else {
            xqCount = commonService.getXqCount(dataSource);
        }
        if (RedisUtils.isExistsObject("buildingCount" + dataSource)) {
            buildingCount = RedisUtils.getCacheObject("buildingCount" + dataSource);
        } else {
            buildingCount = commonService.getBuildingCount(dataSource);
        }
        if (RedisUtils.isExistsObject("unitCount" + dataSource)) {
            unitCount = RedisUtils.getCacheObject("unitCount" + dataSource);
        } else {
            unitCount = commonService.getUnitCount(dataSource);
        }
        IndexTotalVo vo = new IndexTotalVo();
        vo.setUserNum(userCount);
        vo.setXqNum(xqCount);
        vo.setBuildingNum(buildingCount);
        vo.setUnitNum(unitCount);
        return R.ok(vo);
    }

    //todo 三、1.家庭医生签约总数（这个目前只有文博苑有） 2.服务统计（不好查）（这个服务统计指的是什么？可以改成未签约数量）//写死就好了，因为数据是在精细化平台的且目前只有文博苑有这个关联数据
    @GetMapping({"getDoctorStatistic"})
    public R<CommonVo> getDoctorStatistic() {
        CommonVo vo = new CommonVo();
        vo.setDoctorYQYNum(1728); //已签约
        vo.setDoctorWQYNum(4292); //未签约
        return R.ok(vo);
    }

    //todo 四、1获取志愿者活动发布的信息类型 并且统计其各个类型的信息占比（这个基础数据统计可以初始化的时候进行查询，信息类型从字典中取值）
    @GetMapping({"getZhiYuanStatistic"})
    public R<CommonVo> getZhiYuanStatistic() {
        CommonVo vo = new CommonVo();
        if (RedisUtils.isExistsObject("ZhiYuanStatistic")) {
            Map<String, Integer> vo1 = RedisUtils.getCacheMap("ZhiYuanStatistic");
            vo.setZhiYuanStatistic(vo1);
        } else {
            Map<String, Integer> vo1 = commonService.initZhiYuanStatistic();
            vo.setZhiYuanStatistic(vo1);
        }
        String typeStr = "助老,助残,环境保护,大型赛事,助学";
        vo.setZhiYuanTypeList(typeStr.split(","));
        return R.ok(vo);
    }

    //todo 五、1.获取志愿者积分排行榜信息 （积分排行也可以在初始化中先把所有库中的积分排行查出来。然后再取出来统一排序）
    @GetMapping({"getZhiYuanJiFen"})
    public R<List<ZhiYuanJiFenVo>> getZhiYuanJiFen() {
        List<ZhiYuanJiFenVo> vo ;
        if (RedisUtils.isExistsObject("ZhiYuanJiFen")) {
            vo = RedisUtils.getCacheObject("ZhiYuanJiFen");
        } else {
            vo = commonService.getZhiYuanJiFen();
        }
        return R.ok(vo);
    }

    //todo 六、1.获取事件反馈处理统计 统计 12个月份每个月份的反馈总数量和处理的数量 （柱状图数据）（在初始化中先把所有库中的反馈数据统计按月份查出来。然后再取出来根据月份累加进行返回结果）
    @GetMapping({"getFeedbackStatistic"})
    public R<Map<String, Integer>> getFeedbackStatistic() {
        if (RedisUtils.isExistsObject("FeedbackStatistic")) {
            Map<String, Integer> vo1 = RedisUtils.getCacheMap("FeedbackStatistic");
            return R.ok(vo1);
        } else {
            Map<String, Integer> vo1 = commonService.initFeedbackStatistic();
            return R.ok(vo1);
        }
    }

    //todo 七、1.获取用户活跃度统计 包含：活跃用户数、新增用户、注册志愿者、活跃志愿者  （这里的指标可以换一下，换成总用户数量，昨日新增用户，志愿者总数，昨日注册志愿者；查询方法也通过初始化缓存以及定时任务方式实现）
    @GetMapping({"getUserStatistic"})
    public R<Map<String, Integer>> getUserStatistic() {
        if (RedisUtils.isExistsObject("UserStatistic")) {
            Map<String, Integer> vo1 = RedisUtils.getCacheMap("UserStatistic");
            return R.ok(vo1);
        } else {
            Map<String, Integer> vo1 = commonService.initUserStatistic();
            return R.ok(vo1);
        }
    }

    //todo 八、1.获取民主议事全年每个月份 发布数量、 参数人数、 参与率、 参与率排名  （在初始化中先把所有库中的反馈数据统计按月份查出来。然后再取出来根据月份累加进行返回结果）
    @GetMapping({"getVoteStatistic"})
    public R<VoteVo> getVoteStatistic() {
        if (RedisUtils.isExistsObject("VoteStatistic")) {
            VoteVo vo1 = RedisUtils.getCacheObject("VoteStatistic");
            return R.ok(vo1);
        } else {
            VoteVo vo1 = commonService.initVoteStatistic();
            return R.ok(vo1);
        }
    }
    //todo 九、1.志愿服务时长趋势 （这个找不到统计指标）（这个不好统计，可以统计志愿服务时长，但是趋势没法统计,毕竟是48个社区的数据）

    //todo 十、1.获取注册用户中 的实名认证和未实名认证的占比情况  （初始化+定时任务拉出基础数据）
    @GetMapping({"getUserInfoStatistic"})
    public R<Map<String, Integer>> getUserInfoStatistic() {
        if (RedisUtils.isExistsObject("UserInfoStatistic")) {
            Map<String, Integer> vo1 = RedisUtils.getCacheMap("UserInfoStatistic");
            return R.ok(vo1);
        } else {
            Map<String, Integer> vo1 = commonService.initUserInfoStatistic();
            return R.ok(vo1);
        }
    }

    //社区详情指标
    //todo 1.查询本社区的志愿者活动数量、参与人数、服务时间(服务时间去掉了，这个没法统计，统计没有意义)
    @GetMapping({"getZhiYuanStatisticByCommunityId"})
    public R getUserInfoStatistic(@RequestParam("communityId") String communityId) {
       /* if (RedisUtils.isExistsObject("ZhiYuanStatisticByCommunityId"+CommunityEnum.getCommunity(communityId).name())) {
            return R.ok(RedisUtils.getCacheMap("ZhiYuanStatisticByCommunityId"+CommunityEnum.getCommunity(communityId).name()));
        }*/
        Map map = commonService.getZhiyuanStatisticByDataSource(CommunityEnum.getCommunity(communityId).name());
        return R.ok(map);
    }
    //todo 1.查询志愿者服务抢单率 （已报名人数/需要参与人数 * 100%）
    @GetMapping({"getZhiYuanRateStatisticByCommunityId"})
    public R getZhiYuanRateStatisticByCommunityId(@RequestParam("communityId") String communityId) {
        /*if (RedisUtils.isExistsObject("ZhiYuanRateStatisticByCommunityId"+CommunityEnum.getCommunity(communityId).name())) {
            return R.ok(RedisUtils.getCacheMap("ZhiYuanRateStatisticByCommunityId"+CommunityEnum.getCommunity(communityId).name()));
        }*/
        Map map = commonService.getZhiYuanRateStatisticByCommunityId(CommunityEnum.getCommunity(communityId).name());
        return R.ok(map);
    }
    //todo 1.本社区内志愿者积分排行
    @GetMapping({"getZhiYuanJiFenByCommunityId"})
    public R<List<ZhiYuanJiFenVo>> getZhiYuanJiFenByCommunityId(@RequestParam("communityId") String communityId) {
      /*  if (RedisUtils.isExistsObject("ZhiYuanJiFen"+CommunityEnum.getCommunity(communityId).name())) {
            return R.ok(RedisUtils.getCacheObject("ZhiYuanJiFen"+CommunityEnum.getCommunity(communityId).name()));
        }*/
        List<ZhiYuanJiFenVo> map = commonService.getZhiYuanJiFenByCommunityId(CommunityEnum.getCommunity(communityId).name());
        return R.ok(map);
    }
    //todo 1.积分兑换趋势 查询每个月的积分兑换商品的次数或者积分订单数、以及对应消耗的积分信息 （铁西社区、其他社区还未上该功能）
    @GetMapping({"getJiFenDuiHuanStatistic"})
    public R getJiFenDuiHuanStatistic(@RequestParam("communityId") String communityId) {
       /* if (RedisUtils.isExistsObject("JiFenDuiHuan"+CommunityEnum.getCommunity(communityId).name())) {
            return R.ok(RedisUtils.getCacheMap("JiFenDuiHuan"+CommunityEnum.getCommunity(communityId).name()));
        }*/
        Map result=new HashMap();
        List<FeedbackVo> map = commonService.getJiFenDuiHuanByCommunityId(CommunityEnum.getCommunity(communityId).name());
        List<FeedbackVo> jifenNum = commonService.getJiFenDuiHuanSumByCommunityId(CommunityEnum.getCommunity(communityId).name());
        result.put("countData",map);
        result.put("jifenData",jifenNum);
       /* RedisUtils.setCacheMap("JiFenDuiHuan"+CommunityEnum.getCommunity(communityId).name(),result);*/
        return R.ok(map);
    }
    //todo 1.问题处理效率，查询社区     处理的事件反馈数/所有的事件反馈数 * 100%
    @GetMapping({"getFeedbackRateStatistic"})
    public R getFeedbackRateStatistic(@RequestParam("communityId") String communityId) {
        /*if (RedisUtils.isExistsObject("FeedbackRate"+CommunityEnum.getCommunity(communityId).name())) {
            return R.ok(RedisUtils.getCacheObject("FeedbackRate"+CommunityEnum.getCommunity(communityId).name()));
        }*/
        int count = commonService.getFeedbackRateByCommunityId(CommunityEnum.getCommunity(communityId).name());
        Map map=new HashMap();
        map.put("rateCount",count);
        map.put("rateStr",count+"%");
//        RedisUtils.setCacheMap("FeedbackRate"+CommunityEnum.getCommunity(communityId).name(),map);
        return R.ok(map);
    }
    //todo 1.网格服务统计   服务次数、服务用户数、问题解决数 （找不到对应的指标可以考虑替换掉该位置的内容）

    //todo 1.投票参与情况 统计本社区内投票活动数量、参与人数、投票占比
    @GetMapping({"getVoteStatisticByCommunityId"})
    public R<VoteVo> getVoteStatistic(@RequestParam("communityId") String communityId) {
        if (RedisUtils.isExistsObject("VoteStatistic")) {
            VoteVo vo1 = RedisUtils.getCacheObject("VoteStatistic");
            return R.ok(vo1);
        } else {
            VoteVo vo1 = commonService.initVoteStatistic();
            return R.ok(vo1);
        }
    }
    //todo 1.


    //todo
    //todo 1.统计小区医生服务排行  服务次数（没有该指标） 替换或者造假数据
    //todo 1.便民服务综合提醒  服务订单数 、交易成功数、 医疗服务人次
    //todo 1.

    /**
     * 获取活跃用户的指标信息
     */
    @GetMapping("/getUserList")
    public void getUserList() {


    }


}
